/**
 @file pic16F877A.c
 @brief Definicion de la api funciones para lectura/escritura pic 16f877A
   por medio de un convertidor USB-RS-232-C

*/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>      // Modos de apertura de dispositivos
#include <termios.h>   // struct termios
#include <stdio.h>     // printf
#include <stdlib.h>
#include <string.h>    // bzero

#include "pic16F877A.h"

#define DEBUG


// Descriptor puerto de comunicaciones.
int fd;

/**
 @brief inicio de la comunicacion con el PIC
 @return 0 Inicializaci�n exitosa, en caso contrario:
           1 Error al abrir el puerto.
           2 Error al asignar los atributos al puerto.
           3 Error al crear el semaforo del puerto.

*/
int inicioComunicacionPIC(){
  int respuesta;
  struct termios newtio;

  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
  if (fd <0) {
     perror("Abriedo puerto serie de los motores");
     return(1);
  }

  bzero((void *)&newtio, sizeof(newtio));

  // Velocidad, paridad, stop, bit, echo ..
  newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR | ICRNL;
  newtio.c_oflag = 0;
  newtio.c_lflag = ECHO | ICANON ;
  // Caracteres de control
  newtio.c_cc[VINTR]    = 0;
  newtio.c_cc[VQUIT]    = 0;
  newtio.c_cc[VERASE]   = 0;
  newtio.c_cc[VKILL]    = 0;
  newtio.c_cc[VEOF]     = 4;
  newtio.c_cc[VSWTC]    = 0;
  newtio.c_cc[VSTART]   = 0;
  newtio.c_cc[VSTOP]    = 0;
  newtio.c_cc[VSUSP]    = 0;
  newtio.c_cc[VEOL]     = 0;
  newtio.c_cc[VREPRINT] = 0;
  newtio.c_cc[VDISCARD] = 0;
  newtio.c_cc[VWERASE]  = 0;
  newtio.c_cc[VLNEXT]   = 0;
  newtio.c_cc[VEOL2]    = 0;
  // Bloqueo por caracter con tiempo de espera infinito.
  newtio.c_cc[VTIME]    = 0;
  newtio.c_cc[VMIN]     = 1;
  // Activacion de configuraci�n.
  tcflush(fd, TCIFLUSH);
  respuesta = tcsetattr(fd,TCSANOW,&newtio);

  if ( respuesta ){
     perror("Configuando puerto USB-RS-232-C");
     return(2);
  }

  // El puerto acept� la configuraci�n y el semaforo est� activo.
  return(0);
}

/**
 @brief Leer datos del PIC
 @param datos puntero a la direcciones de memoria donde se encuentran los datos.
 @return 0 operaci�n exitosa.
         1 Error al leer

*/
int leeDatosPIC(char* datos){
  int respuesta;
  respuesta = read(fd,datos, 16);
  if ( respuesta != 16 )
    return(1);

  return(0);
}


/**
 @brief escribir en el PIC
@param datos a escribir en el PIC
 @return 0 operaci�n exitosa.
         1 Error al escribir
*/
int colocaDatosPIC(const char* datos){
	return 0;
}

